package com.material.c2c.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtil {

	public enum DateStyle {

		YYYY_MM("yyyy-MM"),
		YYYY_MM_DD("yyyy-MM-dd"),
		YYYY_MM_DD_HH_MM("yyyy-MM-dd HH:mm"),
		YYYY_MM_DD_HH_MM_SS("yyyy-MM-dd HH:mm:ss"),
		MM_DD("MM-dd"),
		HH_MM("HH:mm"),
		HH_MM_SS("HH:mm:ss"),
		YYYY("yyyy"),
		YYYYMM("yyyyMM"),
		YYYYMMDD("yyyyMMdd"),
		YYYYMMDDHHMMSS("yyyyMMddHHmmss"),
		YYYYMMDDHHMMSSSSS("yyyyMMddHHmmssSSS"),

		MM_DD_EN("MM/dd"),
		YYYY_MM_EN("yyyy/MM"),
		YYYY_MM_DD_EN("yyyy/MM/dd"),
		MM_DD_HH_MM_EN("MM/dd HH:mm"),
		MM_DD_HH_MM_SS_EN("MM/dd HH:mm:ss"),
		YYYY_MM_DD_HH_MM_EN("yyyy/MM/dd HH:mm"),
		YYYY_MM_DD_HH_MM_SS_EN("yyyy/MM/dd HH:mm:ss"),

		MM_DD_CN("MM月dd日"),
		YYYY_MM_CN("yyyy年MM月"),
		YYYY_MM_DD_CN("yyyy年MM月dd日"),
		MM_DD_HH_MM_CN("MM月dd日 HH:mm"),
		MM_DD_HH_MM_SS_CN("MM月dd日 HH:mm:ss"),
		YYYY_MM_DD_HH_MM_CN("yyyy年MM月dd日 HH:mm"),
		YYYY_MM_DD_HH_MM_SS_CN("yyyy年MM月dd日 HH:mm:ss");

		private String value;
		DateStyle(String value) {
			this.value = value;
		}
		public String getValue() {
			return value;
		}
	}

	public enum Week {

	    MONDAY("星期一", "Monday", "Mon.", 1),
	    TUESDAY("星期二", "Tuesday", "Tues.", 2),
	    WEDNESDAY("星期三", "Wednesday", "Wed.", 3),
	    THURSDAY("星期四", "Thursday", "Thur.", 4),
	    FRIDAY("星期五", "Friday", "Fri.", 5),
	    SATURDAY("星期六", "Saturday", "Sat.", 6),
	    SUNDAY("星期日", "Sunday", "Sun.", 7);

	    String name_cn;
	    String name_en;
	    String name_enShort;
	    int number;

	    Week(String name_cn, String name_en, String name_enShort, int number) {
	        this.name_cn = name_cn;
	        this.name_en = name_en;
	        this.name_enShort = name_enShort;
	        this.number = number;
	    }
	    public String getCnName() {
	        return name_cn;
	    }
	    public String getEnName() {
	        return name_en;
	    }
	    public String getEnShortName() {
	        return name_enShort;
	    }
	    public int getNumber() {
	        return number;
	    }
	}

	/**
     * 获取日期的年份。失败返回0。
     * @param date 日期
     * @return 年份
	 * @author: LTAO /四川凯普顿信息技术股份有限公司
	 * 2016年4月14日 下午2:37:32
     */
    public static int getYear(Date date) {
        return getInteger(date, Calendar.YEAR);
    }

	/**
     * 获取日期的月。失败返回0。
     * @param date 日期
     * @return 年份
	 * @author: LTAO /四川凯普顿信息技术股份有限公司
	 * 2016年4月14日 下午2:37:32
     */
    public static int getMonth(Date date) {
        return getInteger(date, Calendar.MONTH) + 1;
    }
    /**
     * 获取日期中的某数值。如获取月份
     * @param date 日期
     * @param dateType 日期格式
     * @return 数值
     * @return 日期
	 * @author: LTAO /四川凯普顿信息技术股份有限公司
	 * 2016年4月14日 下午2:37:32
     */
    private static int getInteger(Date date, int dateType) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(dateType);
    }

	/**
	 * 将日期字符串转化为日期。失败返回null。
	 * @describe:
	 * @author: LTAO /四川凯普顿信息技术股份有限公司
	 * 2016年4月14日 下午2:31:17
	 * @since:v1.0
	 */
	public static Date StringToDate(String source,String parttern) throws ParseException{
		return new SimpleDateFormat(parttern).parse(source);
	}

	/**
	 *
	 * @describe:
	 * @author: LTAO /四川凯普顿信息技术股份有限公司
	 * 2016年4月14日 下午2:31:21
	 * @since:v1.0
	 */
	public static String dateToString(Date date,String parttern){
		return new SimpleDateFormat(parttern).format(date);
	}


	/**
     * 获取日期的星期。失败返回null。
     * @param date 日期
     * @return 星期
     */
    public static Week getWeek(Date date) {
        Week week = null;
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int weekNumber = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        switch (weekNumber) {
	        case 0:
	            week = Week.SUNDAY;
	            break;
	        case 1:
	            week = Week.MONDAY;
	            break;
	        case 2:
	            week = Week.TUESDAY;
	            break;
	        case 3:
	            week = Week.WEDNESDAY;
	            break;
	        case 4:
	            week = Week.THURSDAY;
	            break;
	        case 5:
	            week = Week.FRIDAY;
	            break;
	        case 6:
	            week = Week.SATURDAY;
	            break;
        }
        return week;
    }

	/**
	 * 获取日期字符串 空返回""
	 * @param date
	 * @param format
	 * @return
	 */
	public static String getFormatDate(Date date, String format) {
		String dateStr = null;
		try {
			if (date != null) dateStr = new SimpleDateFormat(format).format(date);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return dateStr;
	}

	/**
	 * 获取日期字符串 当前时间 yyyy-MM-dd HH:mm:ss
	 * @return
	 */
	public static String getDateStrYMDHMS() {
		return getFormatDate(new Date(), DateStyle.YYYY_MM_DD_HH_MM_SS.getValue());
	}

	/**
	 * 获取日期字符串 yyyy-MM-dd HH:mm:ss
	 * @param date
	 * @return
	 */
	public static String getDateStrYMDHMS(Date date) {
		return getFormatDate(date, DateStyle.YYYY_MM_DD_HH_MM_SS.getValue());
	}

	/**
	 * 获取日期字符串 当前时间 yyyy-MM-dd
	 * @return
	 */
	public static String getDateStrYMD() {
		return getFormatDate(new Date(), DateStyle.YYYY_MM_DD.getValue());
	}

	/**
	 * 获取日期字符串 yyyy-MM-dd
	 * @param date
	 * @return
	 */
	public static String getDateStrYMD(Date date) {
		return getFormatDate(date, DateStyle.YYYY_MM_DD.getValue());
	}

	/**
	 * 获取日期字符串 HH:mm:ss
	 * @return
	 */
	public static String getDateStrHMS() {
		return getFormatDate(new Date(), DateStyle.HH_MM_SS.getValue());
	}

	/**
	 * 获取日期字符串 HH:mm:ss
	 * @return
	 */
	public static String getDateStrHMS(Date date) {
		return getFormatDate(date, DateStyle.HH_MM_SS.getValue());
	}

	/**
	 * 获取日期字符串 yyyyMMddHHmmssSSS
	 * @return
	 */
	public static String getDateStrSimpleYMDHMSS() {
		return getFormatDate(new Date(), DateStyle.YYYYMMDDHHMMSSSSS.getValue());
	}

	/**
	 * 获取日期字符串 yyyyMMddHHmmssSSS
	 * @return
	 */
	public static String getDateStrSimpleYMDHMSS(Date date) {
		return getFormatDate(date, DateStyle.YYYYMMDDHHMMSSSSS.getValue());
	}

	/**
	 * 根据日期字符串生成日期
	 * @param dateStr
	 * @param format
	 * @return
	 */
	public static Date getDateByStr(String dateStr, String format) {
		Date date = null;
		try {
			if (dateStr != null && !"".equals(dateStr)) {
				date = new SimpleDateFormat(format).parse(dateStr);
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}

	/**
	 * 根据日期字符串生成日期 yyyy-MM-dd HH:mm:ss
	 * @param dateStr
	 * @return
	 */
	public static Date getDateByStrYMDHMS(String dateStr) {
		return getDateByStr(dateStr, DateStyle.YYYY_MM_DD_HH_MM_SS.getValue());
	}

	/**
	 * 根据日期字符串生成日期 yyyy-MM-dd
	 * @param dateStr
	 * @return
	 */
	public static Date getDateByStrYMD(String dateStr) {
		return getDateByStr(dateStr, DateStyle.YYYY_MM_DD.getValue());
	}


	/**
	 * 根据生日计算年龄
	 * @param birthDate
	 * @return
	 */
	public static int getAge(String birthStr) {
		Date birthDate = getDateByStr(birthStr, "yyyyMMdd");
		if (birthDate == null)
		throw new
		RuntimeException("出生日期不能为null");
		int age = 0;
		Date now = new Date();
		SimpleDateFormat format_y = new SimpleDateFormat("yyyy");
		SimpleDateFormat format_M = new SimpleDateFormat("MM");
		String birth_year =
		format_y.format(birthDate);
		String this_year =
		format_y.format(now);

		String birth_month =
		format_M.format(birthDate);
		String this_month =
		format_M.format(now);
		// 初步，估算
		age = Integer.parseInt(this_year) - Integer.parseInt(birth_year);
		// 如果未到出生月份，则age - 1
		if(this_month.compareTo(birth_month) < 0)
		age -= 1;
		if (age < 0)
		age = 0;
		return age;
	}

	public static Date dateAdd(Date date, int day){
		Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
		calendar.add(Calendar.DATE, day);
		return calendar.getTime();
	}

}
